# 状态模式

# ⭐ => 允许对象在内部状态改变时改变它的行为。

# 角色
# 状态: 定义了一个接口，用于封装与Context的一个特定状态相关的行为。
# 具体状态: 实现了State接口，定义了一个与Context的一个特定状态相关的行为。
# 上下文: 定义了客户感兴趣的接口，维护一个ConcreteState子类的实例，这个实例定义了当前状态。

from abc import ABCMeta, abstractmethod

class State(metaclass=ABCMeta):
    @abstractmethod
    def handle(self):
        pass

class ConcreteStateA(State):
    def handle(self):
        print("ConcreteStateA handle")

class ConcreteStateB(State):
    def handle(self):
        print("ConcreteStateB handle")

class Context:
    def __init__(self, state: State = None):
        self.state = state

    def setState(self, state: State):
        self.state = state

    def handle(self):
        self.state.handle()

if __name__ == "__main__":
    context = Context()
    context.setState(ConcreteStateA())
    context.handle()
    context.setState(ConcreteStateB())
    context.handle()
    # Output: ConcreteStateA handle ConcreteStateB handle